package clnt;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * @author danilo
 * 
 */
public class ControleEmpresa {
	private static boolean req;

	/**
	 * @param args
	 *            : recebe como entrada um diretório onde serão feitas as
	 *            operações
	 */
	public static void main(String args[]) {
		// TODO:Implementar a varredura dos diretórios "clientes" "transacoes"

		String dir = args[0];
		//String dirTransacoes = args[1];
		String ip = args[1];
		String porta = args[2];
		
		req = (args.length > 3);

		enviarArquivos(dir + "/Clientes", ip, porta);
		enviarArquivos(dir + "/Transacoes", ip, porta);
		enviarArquivos(dir + "/Empresa", ip, porta);
	}

	/**
	 * Obtem os arquivos n�o envidaos no dado diret�rio e envia suas vers�es
	 * transformadas. Ap�s enviados eles ser�o movidos para a para a pasta de
	 * arquivos enviados.
	 * 
	 * @param dir
	 * @param ip
	 * @param porta
	 */
	private static void enviarArquivos(String dir, String ip, String porta) {

		File xsltFile = new File(dir).listFiles(new XSLTFileFilter())[0];

		for (File f : new File(dir + File.separator + "nao-enviados")
				.listFiles(new XMLFileFilter())) {
			enviar(transformar(f, xsltFile), ip, porta);
			
			if (!req)
				mover(f, new File(dir + File.separator + "enviados"));
		}
	}

	private static Document enviar(Document xmlDoc, String ip, String porta) {
		try {
			Socket client = new Socket(ip, new Integer(porta));
			
			DataInputStream in = new DataInputStream(client.getInputStream());
			DataOutputStream out = new DataOutputStream(client.getOutputStream());
			
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer t = tf.newTransformer();
			t.transform(new DOMSource(xmlDoc), new StreamResult(out));
			
			String resposta = in.readUTF(); 
			if(!resposta.equals("OK") && !resposta.equals("XML Desconhecido")){
				Node cliente = xmlDoc.getElementsByTagName("cliente").item(0);
				Element cartao = xmlDoc.createElement("cartao");
				cartao.setTextContent(resposta);
				cliente.appendChild(cartao);
			}
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return xmlDoc;
		
	}

	private static void mover(File f, File dir) {

		// move o arquivo para o novo diretorio
		boolean ok = f.renameTo(new File(dir, f.getName()));
		if (ok) {
			System.out.println("Arquivo foi movido com sucesso");
		} else {
			System.out.println("Nao foi possivel mover o arquivo");
		}

	}


	private static Document transformar(File file, File xslt) {

		Document transDoc = null;
		DOMResult transRaiz = null;

		try {
			DocumentBuilderFactory xmlBFac = DocumentBuilderFactory.newInstance();
			DocumentBuilder xmlBuilder = xmlBFac.newDocumentBuilder();
			Document xmlDoc = xmlBuilder.parse(new FileInputStream(file));
			
			
			Source xsltSrc = new StreamSource(xslt);
			Transformer xsltTrans = TransformerFactory.newInstance()
					.newTransformer(xsltSrc);
			transRaiz = new DOMResult();
			xsltTrans.transform(new DOMSource(xmlDoc), transRaiz);

			xmlBFac.setValidating(true);
			xmlBuilder = xmlBFac.newDocumentBuilder();
			transDoc = xmlBuilder.newDocument();
			//transDoc.adoptNode((transRaiz.getNode().getOwnerDocument()));
		} catch (Exception e) {
			e.printStackTrace();
		}

		return transRaiz.getNode().getOwnerDocument();
	}

}
